from tkinter import *
import tkinter.font as tkFont
import tkinter.messagebox
import pickle
import mainpage



# 设立窗口window
window = Tk()

# 给窗口的可视化起名字
window.title("重庆第二师范学院")

# 将窗口固定在屏幕中间
width = 800
height = 600
screenwidth = window.winfo_screenwidth()
screenheight = window.winfo_screenheight()
alignstr = '%dx%d+%d+%d' % (width, height, (screenwidth-width)/2, (screenheight-height)/3)
window.geometry(alignstr)

# 设置窗口大小不可改变
window.resizable(width=False,height=False)
# 更改tk图标
window.iconphoto(False, PhotoImage(file='tb.png'))

# 在图形界面上创建 550 * 800 大小的画布并放置各种元素
canvas = Canvas(window, height=550, width=800)

# 说明图片位置，并导入图片到画布上
image_file = PhotoImage(file='校园.png')
image1 = canvas.create_image(0,0, anchor='nw',image=image_file)
canvas.pack(side="top")

# 画布上面添加文字
canvas.create_text(382,100,text="个人记账系统",fill="darkorange",font=("Purisa", 60))
# 字体大小

ft1 = tkFont.Font(size=16, weight=tkFont.BOLD)
ft2 = tkFont.Font(size=16, weight=tkFont.BOLD)


# 用户信息
Label(window, text="用户名:", font=ft1).place(x=10, y=560)
Label(window, text="密码：", font=ft2).place(x=300, y=560)

# 用户登录输入框entry
# 用户名
var_usr_name = StringVar()
entry_usr_name = Entry(window,textvariable=var_usr_name,font=('Arial', 14))
entry_usr_name.place(x=100, y=562,width=150)

# 用户密码
var_usr_pwd = StringVar()
var_usr_pwd = Entry(window,textvariable=var_usr_pwd,font=('Arial', 14),show="*")
var_usr_pwd.place(x=370, y=562,width=150)


# 定义用户登录功能
def usr_login():
    # 这两行代码就是获取用户输入的usr_name和usr_pwd
    usr_name = var_usr_name.get()
    usr_pwd = var_usr_pwd.get()

    # 这里设置异常捕获，当我们第一次访问用户信息文件时是不存在的，所以这里设置异常捕获。
    # 中间的两行就是我们的匹配，即程序将输入的信息和文件中的信息匹配。
    try:
        with open('usrs_info.pickle', 'rb') as usr_file:
            usrs_info = pickle.load(usr_file)
    except FileNotFoundError:
        # 这里就是我们在没有读取到`usr_file`的时候，程序会创建一个`usr_file`这个文件，并将管理员
        # 的用户和密码写入，即用户名为`admin`密码为`admin`。
        with open('usrs_info.pickle', 'wb') as usr_file:
            usrs_info = {'admin': 'admin'}
            pickle.dump(usrs_info, usr_file)
            usr_file.close()  # 必须先关闭，否则pickle.load()会出现EOFError: Ran out of input

    # 如果用户名和密码与文件中的匹配成功，则会登录成功，并跳出弹窗，你好 ? 加上你的用户名。
    if usr_name in usrs_info:
        if usr_pwd == usrs_info[usr_name]:
            # 关闭登录界面窗口
            window.destroy()
            # 调用第二个窗口的方法
            mainpage.win_two()
        # 如果用户名匹配成功，而密码输入错误，则会弹出'密码输入错误，请重试.'
        else:
            tkinter.messagebox.showerror(message='密码输入错误，请重试')
    else:  # 如果发现用户名不存在
        is_sign_up = tkinter.messagebox.askyesno('你还没有注册,是否现在注册?')
        # 提示需不需要注册新用户
        if is_sign_up:
            usr_sign_up()


# 定义用户注册功能
def usr_sign_up():
    def sign_to():
        # 以下三行就是获取我们注册时所输入的信息
        np = new_pwd.get()
        npf = new_pwd_confirm.get()
        nn = new_name.get()

        # 这里是打开我们记录数据的文件，将注册信息读出
        with open('usrs_info.pickle', 'rb') as usr_file:
            exist_usr_info = pickle.load(usr_file)
        # 这里就是判断，如果两次密码输入不一致，则提示两次输入的密码不一致，请重试!
        if np != npf:
            tkinter.messagebox.showerror('输入密码不一致，请重试!')

        # 如果用户名已经在我们的数据文件中，则提示错误，用户已经注册!
        elif nn in exist_usr_info:
            tkinter.messagebox.showerror('用户已经注册!')

        # 最后如果输入无以上错误，则将注册输入的信息记录到文件当中，并提示注册成功欢迎', '你已经成功注册!，然后销毁窗口。
        else:
            exist_usr_info[nn] = np
            with open('usrs_info.pickle', 'wb') as usr_file:
                pickle.dump(exist_usr_info, usr_file)
            tkinter.messagebox.showinfo('注册成功!')
            # 然后销毁窗口。
            window_sign_up.destroy()

    # 定义长在窗口上的窗口
    window_sign_up = Toplevel(window)
    window_sign_up.geometry('300x200')
    window_sign_up.title('注册')
    window_sign_up.configure(background='ivory')

    new_name = StringVar()  # 将输入的注册名赋值给变量
    new_name.set('')
    Label(window_sign_up, text='用户名: ').place(x=10, y=10)  # 将`User name:`放置在坐标（10,10）。
    entry_new_name = Entry(window_sign_up, textvariable=new_name)  # 创建一个注册名的`entry`，变量为`new_name`
    entry_new_name.place(x=130, y=10)  # `entry`放置在坐标（150,10）.

    new_pwd = StringVar()
    Label(window_sign_up, text='密码: ').place(x=10, y=50)
    entry_usr_pwd = Entry(window_sign_up, textvariable=new_pwd, show='*')
    entry_usr_pwd.place(x=130, y=50)

    new_pwd_confirm = StringVar()
    Label(window_sign_up, text='确认密码: ').place(x=10, y=90)
    entry_usr_pwd_confirm = Entry(window_sign_up, textvariable=new_pwd_confirm, show='*')
    entry_usr_pwd_confirm.place(x=130, y=90)

    # 下面的 sign_to
    btn_comfirm_sign_up =Button(window_sign_up, text='注册', command=sign_to)
    btn_comfirm_sign_up.place(x=180, y=120)

# 字体大小
ft3 = tkFont.Font(size=13, weight=tkFont.BOLD)
ft4 = tkFont.Font(size=13, weight=tkFont.BOLD)


# 登录，注册，按钮
btn_login = Button(window, text='登录', command=usr_login,font=ft3)
btn_login.place(x=600, y=560)
btn_sign_up = Button(window, text="注册", command=usr_sign_up,font=ft4)
btn_sign_up.place(x=700, y=560)


window.mainloop()
